package com.PAT.practice01;


import java.util.*;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: zjz
 * @Date: 2021/11/15/15:50
 * @Description:当我们验证卡拉兹猜想的时候，为了避免重复计算，可以记录下递推过程中遇到的每一个数。
 * 例如对 n=3 进行验证的时候，我们需要计算 3、5、8、4、2、1，则当我们对 n=5、8、4、2 进行验证的时候，
 * 就可以直接判定卡拉兹猜想的真伪，而不需要重复计算，因为这 4 个数已经在验证3的时候遇到过了，
 * 我们称 5、8、4、2 是被 3“覆盖”的数。我们称一个数列中的某个数 n 为“关键数”，如果 n 不能被数列中的其他数字所覆盖。
 * @Target:如果n是偶数，那么把n砍掉一半；如果n是奇数，那么把 (3n+1) 砍掉一半
 */
public class 继续猜想 {


    // 想法,进行计算时,将它的那些数字记录在set中,当后面的数,set里有,直接跳过,
    // 没有,进行计算存入currentSet,同时判断往sumSet中set时,如果两个set都有,那就将它从noSortSet中移除
    // 三个set,一个时是当前的currentSet,一个是sumSet,一个记录我们要排序的noSortSet


    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        int len = scanner.nextInt();
        HashSet<Integer> noSortSet = new HashSet<>();
        HashSet<Integer> sumSet = new HashSet<>();
        int[] arr = new int[len];
        Stack<Integer> currentSet = new Stack<>();

        for (int i = 0; i < len; i++) {
            arr[i] = scanner.nextInt();

            if(sumSet.contains(arr[i])){
                continue;
            }else {
                currentSet = cutNum(arr[i]);
                while (currentSet.iterator().hasNext()){
                    int n = currentSet.pop();
                    if (noSortSet.contains(n)) {
                        noSortSet.remove(n);
                    }
                    sumSet.add(n);
                }
                noSortSet.add(arr[i]);
            }



        }


        int[] sortArray = new int[noSortSet.size()];
        int p = 0;
        for (Integer integer : noSortSet) {
            sortArray[p++] = integer;
        }

        Arrays.sort(sortArray);
        for (int i =  sortArray.length-1; i >0; i--) {
            System.out.print(sortArray[i]+" ");
        }

        System.out.print(sortArray[0]);


    }


    public static Stack cutNum(int n){

        Stack<Integer> stack = new Stack<>();

        while (n>0&&n!=1){
            stack.add(n);
            n = n%2!=0?(3*n+1)/2:n/2;
        }


        return stack;
    }


}
